home *** CD-ROM | disk | FTP | other *** search
- /* This is a reverse-compilation of Borland's brk() and sbrk() functions.
- ** Borland would prefer that I distribute these things on an object-only
- ** basis, but since this is a bug fix that they knew about on version 1.0
- ** and DIDN'T fix on version 1.5, to heck with them.
- **
- ** This is only needed in small data models, hence the leading #ifdef.
- ** The fix lets us define the so-called red zone, which is the buffer
- ** space between the bottom of the heap and the top of the stack. Also
- ** fixes a bug wherein brk() returned the new brklvl on success. Wrong!
- **
- ** If you '#define original', you'll get Borland's original code.
- */
-
- #if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
-
- #pragma inline
-
- extern int errno;
- extern int __brklvl;
-
- #ifdef original
- #define _STKRED 0x100
- #else
- extern int _STKRED;
- #endif
-
- int __brk(unsigned bar)
- {
- _AX = bar;
- asm mov dx,sp
- _DX -= _STKRED;
- if (_AX < _DX) {
- __brklvl = _AX;
- #ifndef original
- return 0;
- #endif
- }
- else {
- errno = 8;
- _AX = -1;
- }
- }
-
- /*
- Original from Turbo C's cm library:
- BRK_TEXT:___brk:
- 3999:0001 55 PUSH BP
- 3999:0002 8BEC MOV BP,SP
- 3999:0004 8B4606 MOV AX,[BP+06]
- 3999:0007 8BD4 MOV DX,SP
- 3999:0009 81EA0001 SUB DX,0100
- 3999:000D 3BC2 CMP AX,DX
- 3999:000F 7305 JNB ___brk+15 (0016)
- 3999:0011 A38E00 MOV [008E],AX
- 3999:0014 EB09 JMP ___brk+1E (001F)
- 3999:0016 C70688000800 MOV Word Ptr [0088],0008
- 3999:001C B8FFFF MOV AX,FFFF
- 3999:001F 5D POP BP
- 3999:0020 CB RETF
- */
-
- __sbrk(unsigned long bar)
- {
- asm mov ax,[bp+06]
- asm mov dx,[bp+08]
- asm add ax,__brklvl
- asm adc dx,0
- asm mov cx,ax
- _CX += _STKRED;
- asm adc dx,0
- if (_DX == 0 && _CX < _SP) asm xchg ax,__brklvl;
- else {
- errno = 8;
- _AX = -1;
- }
- }
-
- /*
- Original from Turbo C's cm library:
- BRK_TEXT:___sbrk:
- 3999:0021 55 PUSH BP
- 3999:0022 8BEC MOV BP,SP
- 3999:0024 8B4606 MOV AX,[BP+06]
- 3999:0027 8B5608 MOV DX,[BP+08]
- 3999:002A 03068E00 ADD AX,[008E]
- 3999:002E 83D200 ADC DX,+00
- 3999:0031 8BC8 MOV CX,AX
- 3999:0033 81C10001 ADD CX,0100
- 3999:0037 83D200 ADC DX,+00
- 3999:003A 0BD2 OR DX,DX
- 3999:003C 750A JNZ ___sbrk+27 (0048)
- 3999:003E 3BCC CMP CX,SP
- 3999:0040 7306 JNB ___sbrk+27 (0048)
- 3999:0042 87068E00 XCHG AX,[008E]
- 3999:0046 EB09 JMP ___sbrk+30 (0051)
- 3999:0048 C70688000800 MOV Word Ptr [0088],0008
- 3999:004E B8FFFF MOV AX,FFFF
- 3999:0051 5D POP BP
- 3999:0052 CB RETF
- */
-
- int brk(unsigned bar) {return __brk(bar);}
-
- /*
- Original from Turbo C's cm library:
- BRK_TEXT:_brk:
- 3999:0053 55 PUSH BP
- 3999:0054 8BEC MOV BP,SP
- 3999:0056 FF7606 PUSH [BP+06]
- 3999:0059 0E PUSH CS
- 3999:005A E8A4FF CALL ___brk
- 3999:005D 59 POP CX
- 3999:005E 5D POP BP
- 3999:005F CB RETF
- */
-
- sbrk(int bar) {return __sbrk(bar);}
-
- /*
- Original from Turbo C's cm library:
- BRK_TEXT:_sbrk:
- 3999:0060 55 PUSH BP
- 3999:0061 8BEC MOV BP,SP
- 3999:0063 8B4606 MOV AX,[BP+06]
- 3999:0066 99 CWD
- 3999:0067 52 PUSH DX
- 3999:0068 50 PUSH AX
- 3999:0069 0E PUSH CS
- 3999:006A E8B4FF CALL ___sbrk
- 3999:006D 8BE5 MOV SP,BP
- 3999:006F 5D POP BP
- 3999:0070 CB RETF
- */
- #endif
-